package br.com.werp.regras.tesouraria.integracao;

import br.com.werp.regras.geral.Debuger;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO;
import br.com.werp.regras.geral.vos.pessoa.PessoaJuridicaVO;
import br.com.werp.regras.geral.vos.tabelas.Fisica;
import br.com.werp.regras.geral.vos.tabelas.Fornecedor;
import br.com.werp.regras.geral.vos.tabelas.Juridica;
import br.com.werp.regras.geral.vos.tabelas.Pessoa;
import br.com.werp.regras.geral.vos.tesouraria.FornecedorJuridicoFormVO;
import br.com.werp.regras.geral.vos.tesouraria.FornecedorVO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Sobreira
 * Created on 04/10/2004
 */
public class FornecedorDAO extends MasterDAO {
    private static final String ATUALIZA_PESSOA = "ATUALIZA_PESSOA";
    private static final String EXCLUIR_FORNECEDOR_JURIDICA = "EXCLUIR_FORNECEDOR_JURIDICA";
    private static final String EXCLUIR_FORNECEDOR_FISICA = "EXCLUIR_FORNECEDOR_FISICA";
    private static FornecedorDAO fornecedorDAO;

    /**
     * @param banco
     * @throws Exception
     */
    private FornecedorDAO(String banco) throws Exception {
        super(banco);
    }

    public static FornecedorDAO getFornecedorDAO() throws Exception {
        if (fornecedorDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            fornecedorDAO = new FornecedorDAO(bundle.getString(Constantes.BANCO));
        }

        return fornecedorDAO;
    }

    public void atualizaPessoaNome(Object object, String id, String nome)
        throws Exception {
        Connection conn = null;

        try {
            String query = getQuery(ATUALIZA_PESSOA);
            conn = validarTransacao(object);

            PreparedStatement statement = conn.prepareStatement(query);
            setString(1, statement, nome);
            setInt(2, statement, Integer.parseInt(id));
            statement.executeUpdate();
        } catch (Exception e) {
            throw e;
        }
    }

    public void inserirFornecedor(Object object, Fornecedor fornecedor)
        throws Exception {
        Connection conn = validarTransacao(object);
        inserirVO(conn, fornecedor, Util.tabelaVONome(fornecedor));
    }

    public static void main(String[] args) {
        System.out.println(Util.tabelaVONome(new Fornecedor()));
    }

    public FornecedorJuridicoFormVO obterFornecedorJuridico(String pessoaId)
        throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            String tabela = "pessoa,juridica,fornecedor";
            String where = "juri_pessoa = " + pessoaId + " and " +
                "pess_id = juri_pessoa " + "and forn_pessoa = " + pessoaId;
            List lista = preencheVO(conn, new FornecedorJuridicoFormVO(),
                    tabela, where,
                    FornecedorJuridicoFormVO.PROPRIEDADES_EXCLUIDAS);

            if (!lista.isEmpty()) {
                return (FornecedorJuridicoFormVO) lista.get(0);
            } else {
                return null;
            }
        } catch (Exception e) {
            throw e;
        } finally {
            liberaConeccao(conn);
        }
    }

    public void excluirFornecedorJuridico(Object key,
        PessoaJuridicaVO pessoaJuridicaVO) throws Exception, SQLException {
        Connection connection = validarTransacao(key);
        String query = getQuery(EXCLUIR_FORNECEDOR_JURIDICA);

        PreparedStatement statement = connection.prepareStatement(query);
        setInt(1, statement, pessoaJuridicaVO.getJuri_pessoa());
        statement.executeUpdate();
        Debuger.debugar("Excluido Juri_pessoa = " +
            pessoaJuridicaVO.getJuri_pessoa(), getClass());
    }

    public void excluirFornecedorFisica(Object key,
        PessoaFisicaVO pessoaFisicaVO) throws Exception {
        Connection conn = validarTransacao(key);

        String query = getQuery(EXCLUIR_FORNECEDOR_FISICA);
        PreparedStatement statement = conn.prepareStatement(query);
        setInt(1, statement, pessoaFisicaVO.getFisc_pessoa());
        statement.executeUpdate();
        Debuger.debugar("Excluindo Fisc_Pessoa = " +
            pessoaFisicaVO.getFisc_pessoa(), getClass());
    }

    public void atualizarFornecedor(Object key, Fornecedor fornecedor)
        throws Exception {
        Connection connection = validarTransacao(key);
        atualizarVO(connection, fornecedor, new String[] { "forn_pessoa" });
    }

    public List pesquisarFornecedorFisica(Fornecedor fornecedor, Object key)
        throws Exception {
        Connection connection = null;

        if (key != null) {
            connection = validarTransacao(key);
        } else {
            connection = getConexao();
        }

        try {
            /* String tabelas = "pessoa,fisica,fornecedor";
             String where = "and pess_id = fisc_pessoa and pess_id = forn_pessoa";
            
             return pesquisarVO(connection, fornecedor, where, tabelas);
            */
            return pesquisarVO(connection, fornecedor);
        } finally {
            if (key == null) {
                liberaConeccao(connection);
            }
        }
    }

    public List pesquisarFornecedorJuridica(Juridica juridica, Object key)
        throws Exception {
        Connection connection = null;

        if (key != null) {
            connection = validarTransacao(key);
        } else {
            connection = getConexao();
        }

        try {
            /* String tabelas = "pessoa,fisica,fornecedor";
             String where = "and pess_id = fisc_pessoa and pess_id = forn_pessoa";
            
             return pesquisarVO(connection, fornecedor, where, tabelas);
            */
            return pesquisarVO(connection, juridica);
        } finally {
            if (key == null) {
                liberaConeccao(connection);
            }
        }
    }

    public List pesquisarFornecedorFisica(Fornecedor fornecedor)
        throws Exception {
        return pesquisarFornecedorFisica(fornecedor, null);
    }

    public List pesquisarFornecedorJuridica(Juridica juridica)
        throws Exception {
        return pesquisarFornecedorJuridica(juridica, null);
    }

    public List pesquisarFornecedorFisica(FornecedorVO fornecedorVO)
        throws Exception {
        Connection conn = getConexao();

        try {
            String tabelas = "pessoa, fisica , fornecedor";
            String where = " and pess_id = fisc_pessoa and forn_pessoa = pess_id ";

            if (!Util.isNullOrEmpty(fornecedorVO.getPess_nome())) {
                where += (" and pess_nome like " +
                aspasLike(fornecedorVO.getPess_nome()));
                fornecedorVO.setPess_nome(null);
            }

            List exibiveis = new ArrayList();
            exibiveis.addAll(BeanUtil.listarPropriedades(new Pessoa()));
            exibiveis.addAll(BeanUtil.listarPropriedades(new Fisica()));
            exibiveis.addAll(BeanUtil.listarPropriedades(new Fornecedor()));

            return pesquisarVO(conn, fornecedorVO, where, tabelas, exibiveis);
        } finally {
            liberaConeccao(conn);
        }
    }

    public List pesquisarFronecedorJuridicaVOTabela(Fornecedor fornecedor)
        throws Exception {
        return pesquisarFronecedorJuridicaVOTabela(fornecedor, null);
    }

    private List pesquisarFronecedorJuridicaVOTabela(Fornecedor fornecedor,
        Object key) throws Exception {
        Connection connection = null;

        if (key != null) {
            connection = validarTransacao(key);
        } else {
            connection = getConexao();
        }

        try {
            return pesquisarVO(connection, fornecedor);
        } finally {
            if (key == null) {
                liberaConeccao(connection);
            }
        }
    }

    public List pesquisarFornecedorJuridica(FornecedorVO fornecedorVO)
        throws Exception {
        Connection conn = getConexao();

        try {
            String tabelas = "pessoa, juridica , fornecedor";
            String where = " and pess_id = juri_pessoa and forn_pessoa = pess_id ";

            if (!Util.isNullOrEmpty(fornecedorVO.getPess_nome())) {
                where += (" and pess_nome like " +
                aspasLike(fornecedorVO.getPess_nome()));
                fornecedorVO.setPess_nome(null);
            }

            if (!Util.isNullOrEmpty(fornecedorVO.getJuri_nome_fantasia())) {
                where += (" and juri_nome_fantasia like " +
                aspasLike(fornecedorVO.getJuri_nome_fantasia()));
                fornecedorVO.setJuri_nome_fantasia(null);
            }

            List exibiveis = new ArrayList();
            exibiveis.addAll(BeanUtil.listarPropriedades(new Pessoa()));
            exibiveis.addAll(BeanUtil.listarPropriedades(new Juridica()));
            exibiveis.addAll(BeanUtil.listarPropriedades(new Fornecedor()));

            return pesquisarVO(conn, fornecedorVO, where, tabelas, exibiveis);
        } finally {
            liberaConeccao(conn);
        }
    }

    public List pesquisarFornecedorPessoa(FornecedorVO fornecedorVO)
        throws Exception {
        Connection conn = getConexao();

        try {
            String tabelas = "pessoa , fornecedor";
            String where = " and forn_pessoa = pess_id ";

            if (!Util.isNullOrEmpty(fornecedorVO.getPess_nome())) {
                where += (" and pess_nome like " +
                aspasLike(fornecedorVO.getPess_nome()));
                fornecedorVO.setPess_nome(null);
            }

            List exibiveis = new ArrayList();
            exibiveis.addAll(BeanUtil.listarPropriedades(new Pessoa()));
            exibiveis.addAll(BeanUtil.listarPropriedades(new Fornecedor()));

            return pesquisarVO(conn, fornecedorVO, where, tabelas, exibiveis);
        } finally {
            liberaConeccao(conn);
        }
    }
}
